/**
 * 首页业务逻辑代码
 * */

const db = require("../../db/db")
const initModel = require("../../models/init-models")
const {swiper, code, scrip, scrip_img, middle, user} = initModel(db);
const {Op} = require("sequelize");


// 纸条和纸条图片表关联
scrip.hasMany(scrip_img, {
  targetKey: "id",
  foreignKey: "scrip_id"
})
scrip_img.belongsTo(scrip, {
  targetKey: "id",
  foreignKey: "scrip_id"
})

// 使用中间表过渡查取抽取的纸条数据
scrip.hasOne(middle, {
  foreignKey: 'scrip_id',
});
middle.belongsTo(scrip, {
  foreignKey: 'scrip_id',
});



module.exports = {
  // 轮播图、客服二维码/背景图
  allImg: async (req, res) => {
    // 获取轮播图数据
    let allSwiper = await swiper.findAll();
    // 获取客服二维码/背景图
    let imgList = await code.findAll();
    if (allSwiper == null && imgList == null) {
      res.send({
        status: 400,
        msg: "数据获取失败"
      });
      return;
    }
    // 返回数据
    res.send({
      status: 200,
      msg: "获取成功",
      data: {
        swipers: allSwiper,
        code: imgList[0],
        bg_img: imgList[1]
      }
    })
  },
  // 放入纸条
  putScrip: async (req, res) => {
    // 获取用户id
    let {id: userId} = req.user;
    // 判断该用户是否可以放纸条
    let findUser = await user.findOne({where: {id: userId}});
    if(findUser.banned) {
      res.send({
        status: 400,
        msg: "该用户已被封禁"
      });
      return;
    }
    // 获取参数
    let {scrip_content, wechat, images, destroy_num, sex_status, area} = req.body;
    // 判断是否缺少传参
    if (scrip_content == null || wechat == null || sex_status == null || images == null) {
      res.send({
        status: 400,
        msg: "缺少参数"
      });
      return;
    }
    // 判断图片是否大于七张
    // 对纸条图片处理
    let scripImg = images.split(",");
    if (scripImg.length > 7) {
      res.send({
        status: 400,
        msg: "图片最多只能保存七张"
      });
      return;
    }
    // 创建纸条
    let createScrip = await scrip.create({
      scrip_content,
      wechat,
      user_id: userId,
      destroy_num,
      sex_status,
      area,
      create_time: new Date()
    })
    // 获取刚创建的纸条id
    let scrip_id = createScrip.id;
    // 保存 图片
    if (createScrip != null) {
      // 遍历图片数组保存
      for (const i of scripImg) {
        await scrip_img.create({
          scrip_id,
          img: i
        })
      }
    } else {
      // 创建失败
      res.send({
        status: 400,
        msg: "创建失败"
      });
      return;
    }

    // 查找数据
    let findScrip = await scrip.findOne({
      where: {
        id: scrip_id
      },
      attributes: ["id", "scrip_content", "wechat", "sex_status", "area", "create_time"],
      include: [
        {
          model: scrip_img,
          attributes: {exclude: ['scrip_id']},
        },
      ],
    });
    if (findScrip != null) {
      res.send({
        status: 200,
        msg: "创建成功",
        data: findScrip
      })
    }

  },
  // 抽取纸条
  takeScrip: async (req, res) => {
    // 获取用户id
    let {id} = req.user;
    // 判断该用户是否可以放纸条
    let findUser = await user.findOne({where: {id}});
    if(findUser.banned) {
      res.send({
        status: 400,
        msg: "该用户已被封禁"
      });
      return;
    }
    // 获取参数
    let {scrip_type} = req.query;

    // 判断传值是否有效
    if (scrip_type != 0 && scrip_type != 1) {
      res.send({
        status: 400,
        msg: "传值错误"
      });
      return;
    }
    // 查找筛选数据
    let allScrip = await scrip.findAll({
      where: {
        sex_status: scrip_type,
        audit: 2,
        user_id: {
          [Op.ne]: id
        },
      },
      include: [
        {
          model: scrip_img,
          attributes: {exclude: ["scrip_id"]}
        },
      ]
    });
    // 中间表找出当前用户已经抽取过的纸条id
    let findId = await middle.findAll({
      where: {user_id: id},
      attributes: ["scrip_id"]
    })

    // 判断要是中间表是否有数据
    if(findId != null) {
      // 过滤还没被抽取的纸条
      allScrip.forEach((item,index)  => {
        // 遍历查询
        findId.forEach(put => {
          if(item.id == put.scrip_id) {
            allScrip.splice(index,1);
          }
        })
      })
    }

    // 存放筛选过的数据
    let filterScrip = allScrip.filter(item => {
      return item.destroy_num > 0
    })
    // 判断是否有数据
    if (filterScrip.length == 0) {
      let sex = scrip_type == 0 ? "女" : "男";
      res.send({
        status: 400,
        msg: `该${sex}目录下没有数据`
      });
      return;
    }
    // 随机返回
    let randomIndex = Math.floor(Math.random() * filterScrip.length);

    // 对抽取到的纸条销毁次数减减
    filterScrip[randomIndex].destroy_num--;
    // 保存数据
    await filterScrip[randomIndex].save();
    // 保存抽取到的纸条到中间表
    let saveScrip = await middle.create({
      user_id: id,
      scrip_id: filterScrip[randomIndex].id,
      create_time: new Date()
    })
    if(saveScrip != null) {
      // 返回抽取到的数据
      res.send({
        status: 200,
        msg: "抽取成功",
        data: allScrip[randomIndex]
      })
    }

  }
}